package com.sc.nft.admin.consume;

import cn.hutool.core.util.NumberUtil;
import com.alibaba.fastjson.JSONObject;
import com.sc.nft.entity.SecondOrder;
import com.sc.nft.entity.vo.TradingTrendVO;
import com.sc.nft.enums.MessageTopic;
import com.sc.nft.enums.RedisKeyEnum;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.util.concurrent.TimeUnit;
/**
 * 处理2级成交趋势.如果这个里面的key不存在的情况下就不理会 如果存在了,那么就做处理.把内容都分别做处理去.
 */
@RocketMQMessageListener(topic = MessageTopic.SECOND_ORDER_TOPIC + "${spring.profiles.active}", consumerGroup = MessageTopic.SECOND_ORDER_TRADING_TENDENCY + "${spring.profiles.active}")
@Component
@Slf4j
@RequiredArgsConstructor
public class SecondOrderTradingTendencyConsumer implements RocketMQListener<SecondOrder> {
    private final RedisTemplate redisTemplate;
    @Override
    public void onMessage(SecondOrder message) {
        String key= RedisKeyEnum.TRADING_TREND.getKey()+message.getCollectionId();
        // 对象不存在的话就不理会,存在的话在做处理
        if (redisTemplate.hasKey(key)) {
            // 获取对象,把数据都取出来,然后做处理.
            TradingTrendVO tradingTrendVO = JSONObject.parseObject(redisTemplate.opsForValue().get(key).toString(), TradingTrendVO.class);
            // 进入成交量+1
            tradingTrendVO.setTurnover(tradingTrendVO.getTurnover() + 1);
            // 最新成交价更改
            tradingTrendVO.setLatestTransactionPrice(message.getBuyPrice());
            // 最高价和最低价和当前做比对,如果当前的价格比最高价还要高,那么就把最高价更改为当前的价格
            if (NumberUtil.isGreater(message.getBuyPrice(), new BigDecimal(tradingTrendVO.getTodaySHighest()))) {
                tradingTrendVO.setTodaySHighest(message.getBuyPrice());
            }
            // 如果当前的价格比最低价还要低,那么就把最低价更改为当前的价格
            if (NumberUtil.isLess(message.getBuyPrice(), new BigDecimal(tradingTrendVO.getTodaySLowest()))){
                tradingTrendVO.setTodaySLowest(message.getBuyPrice());
            }
            // 把数据放回去
            redisTemplate.opsForValue().set(key, JSONObject.toJSONString(tradingTrendVO),redisTemplate.getExpire(key, TimeUnit.SECONDS),TimeUnit.SECONDS);
        }
    }
}
